require 'singleton'
require 'model/candidato'
require 'model/candidato_dao'
require 'model/eleitor'
require 'model/eleitor_dao'
require "model/eleicao_dao"
require 'controller/eleicao_bo'
require 'controller/eleitor_bo'
require 'view/table'
require 'view/format'
require 'env/module_voto'
require "view/relatorio_view"

class EleitorView
  
  include Singleton

  attr_accessor :eleicao_atual

  def initialize
    
    self
  end
  
#  def get_eleicao
#    @eleicao_atual = EleicaoDao.instance.find_ultima_eleicao
#    return @eleicao_atual
#  end

  def novo_eleitor
    Format.br
    print "Digite o nome do Eleitor: "
    nome = gets.chomp
    eleitor = Eleitor.new
    eleitor.nome = nome
    obj = EleitorBo.instance.save(eleitor)
    if obj.is_a? PollerException
      puts "[VIEW] Ocorreu um erro: #{obj.msg}"
      puts " + #{obj.err}"
      Format.br
    else
      puts "Eleitor cadastrado com sucesso."
      Format.br
    end
  end

  def votar
#    Testa se a eleição está em andamento:
    if EleicaoDao.instance.eleicao_em_andamento?
      Format.br
      eleitor = Eleitor.new
      print "titulo: "
      eleitor.titulo = gets.to_i
      if EleitorBo.instance.eleitor_valido?(eleitor) # Verifica se o eleitor existe
        if EleitorBo.instance.permitir_votar?(eleitor) # Verifica se o eleitor já votou
          cancelar = false
          begin # laço para cancelamento de voto
            # votar
            Format.br
            a_candidato = CandidatoDao.instance.find_all
            unless a_candidato.empty?
              Table.candidato_header
              a_candidato.each do |candidato|
                puts candidato # Mostra os candidatos disponiveis para votação
              end
              Format.br
              puts "[B]ranco - [N]ulo"
              puts "-----------------"
              print "Candidato [id]: "
              candidato = Candidato.new
              choice = gets.chop
              case choice
              when "b", "B", "0"
                # voto em branco = 0
                candidato.id = ModuleVoto::Branco
              when "n", "N"
                # voto nulo
                candidato.id = ModuleVoto::Nulo
              else
                # verificar se é válido. se não contabilize nulo.
                choice = choice.to_i
                a_candidato.each do |c|
                  if c.id.to_i == choice
                    candidato = c
                    break
                  end
                end
              end

              Format.br
              # dados do candidato
              if candidato.id == 0
                puts "Voto em Branco."
              elsif candidato.id.nil?
                puts "Voto Nulo."
              else
                puts "ID : #{candidato.id}, Nome do Candidato : #{candidato.nome},"
                puts "Partido : #{candidato.partido.sigla}."
              end
              #  confirmação de voto
              puts "Confirmação de Voto [S/n]: "
              confirm = gets.downcase.chop
              case confirm
              when "yes", "y", "sim", "s", "1"
                cancelar = false
              when "no", "n", "nao", "0"
                cancelar = true
              else # qualquer outra coisa é considerada _cancelar_
                cancelar = true
              end
            else # não há candidatos
              puts "Não existem Candidatos cadastrados."
              cancelar = false
              Format.br
            end
          end while cancelar # begin ( do ... while() )
          puts "candidato #{candidato.nome}"
          EleitorBo.instance.votar(eleitor, candidato)
          # se for o presidente encerrar a eleicao
          if EleitorDao.instance.presidente?( eleitor )
            # se for o presidente, encerrar a eleição
            Format.br
            EleicaoDao.instance.encerrar_eleicao
            puts "Eleição Encerrada."
            Format.br
            # chama o relatorio de votação
            RelatorioView.instance.relatorio
          end
        else # else permitir votar
          puts "Titulo de Eleitor com voto já contabilizado!\nNão é possível votar mais de uma vez."
          Format.br
        end
      else
        puts "Titulo de Eleitor inválido."
        Format.br
      end
    else # Se a eleição ja tiver sido encerrada. aparece a mensagem
      puts "Eleição Encerrada!!!"
    end
  end

    def listar_eleitores
      Table.eleitor_header
      a_eleitores = EleitorDao.instance.find_all
      a_eleitores.each do |eleitor|
        puts eleitor
      end
      Format.br
    end
end
